"""
VLM图像处理工具
提供图像验证、格式转换和处理功能
"""

import base64
import logging
import os
from typing import Optional, Tuple
from pathlib import Path

from PIL import Image
from config.config_manager import get_config

logger = logging.getLogger(__name__)


def validate_image_data(image_data: str) -> Tuple[bool, str]:
    """
    验证图像数据
    
    Args:
        image_data (str): 图像数据（base64字符串或文件路径）
        
    Returns:
        Tuple[bool, str]: (是否有效, 错误信息)
    """
    config = get_config()
    
    try:
        # 检查是否为base64数据
        if image_data.startswith('data:image/'):
            # 提取base64部分
            header, encoded = image_data.split(',', 1)
            # 检查数据大小
            if len(encoded) > config.vlm.max_image_size:
                return False, f"图像数据过大，最大支持{config.vlm.max_image_size}字节"
            
            # 尝试解码base64数据
            try:
                image_bytes = base64.b64decode(encoded)
            except Exception as e:
                return False, f"base64解码失败: {str(e)}"
            
            # 尝试打开图像验证格式
            try:
                from io import BytesIO
                image = Image.open(BytesIO(image_bytes))
                image.verify()
            except Exception as e:
                return False, f"图像格式无效: {str(e)}"
            
            return True, ""
        elif image_data.startswith('http://') or image_data.startswith('https://'):
            # URL格式，暂时不支持
            return False, "暂不支持URL格式的图像"
        else:
            # 可能是文件路径
            if not os.path.exists(image_data):
                return False, "图像文件不存在"
            
            # 检查文件大小
            file_size = os.path.getsize(image_data)
            if file_size > config.vlm.max_image_size:
                return False, f"图像文件过大，最大支持{config.vlm.max_image_size}字节"
            
            # 检查文件扩展名
            ext = Path(image_data).suffix.lower().lstrip('.')
            if ext not in config.vlm.supported_formats:
                return False, f"不支持的图像格式，支持的格式: {', '.join(config.vlm.supported_formats)}"
            
            # 尝试打开图像验证格式
            try:
                image = Image.open(image_data)
                image.verify()
            except Exception as e:
                return False, f"图像格式无效: {str(e)}"
            
            return True, ""
    except Exception as e:
        return False, f"图像数据验证失败: {str(e)}"


def convert_image_to_base64(image_path: str) -> Optional[str]:
    """
    将图像文件转换为base64编码
    
    Args:
        image_path (str): 图像文件路径
        
    Returns:
        Optional[str]: base64编码的图像数据，失败时返回None
    """
    try:
        # 验证文件
        is_valid, error = validate_image_data(image_path)
        if not is_valid:
            logger.error(f"图像验证失败: {error}")
            return None
        
        # 获取文件扩展名
        ext = Path(image_path).suffix.lower().lstrip('.')
        if ext == 'jpg':
            ext = 'jpeg'
        
        # 读取文件并转换为base64
        with open(image_path, 'rb') as f:
            image_data = f.read()
            base64_data = base64.b64encode(image_data).decode('utf-8')
            return f"data:image/{ext};base64,{base64_data}"
    except Exception as e:
        logger.error(f"图像转换失败: {e}")
        return None


def get_image_format_from_base64(image_base64: str) -> Optional[str]:
    """
    从base64图像数据中提取图像格式
    
    Args:
        image_base64 (str): base64图像数据
        
    Returns:
        Optional[str]: 图像格式，失败时返回None
    """
    try:
        if image_base64.startswith('data:image/'):
            header = image_base64.split(',')[0]
            # 提取格式，如 data:image/png;base64 -> png
            format_part = header.split('/')[1].split(';')[0]
            return format_part
        return None
    except Exception as e:
        logger.error(f"提取图像格式失败: {e}")
        return None